//修改自增主键  ALTER TABLE 表名 AUTO_INCREMENT = 1;

/*
pnpm i -g @nestjs/cli  | pnpm update
nest new projects
cd project pnpm i
修改package.json,添加  "dev": "pnpm start:dev"
nest dev(localhost:3000)
帮助:nest -h、nest new -h...
快速生成模块 nest g resource books



扩展:
CURD扩展:    pnpm install --save @nestjs/typeorm typeorm mysql2 @nestjs/mapped-types 
SwaggerUI:  pnpm i --save @nestjs/swagger swagger-ui-express   (可在main.ts引入)
管道类型校验  pnpm i -D class-validator class-transformer
Redis:      pnpm install --save redis
管理配置文件: pnpm install --save @nestjs/config | pnpm install js-yaml
Session扩展: pnpm i express-session @types/express-session     (可在main.ts引入)
JWT扩展:     pnpm i @nestjs/jwt                                (可在AppModule引入)
AXIOS：      pnpm i -S axios


文件读取上传: pnpm i -D @types/multer 、 pnpm i cors
本地开启http服务: pnpm i -g http-server  | npx http-server
管理node进程: pnpm i -g pm2
发邮件: pnpm install --save nodemailer  pnpm install --save-dev @types/nodemailer
定时任务: pnpm install --save @nestjs/schedule
二维码: pnpm install qrcode @types/qrcode
微服务: pnpm install --save @nestjs/microservices -> pnpm install --save @nestjs/common@^10.0.0 @nestjs/core@^10.0.0
grpc:  pnpm install --save @grpc/grpc-js @grpc/proto-loader
etcd:  pnpm install --save etcd3
Jquery核心功能: pnpm install --save cheerio 




Repl调试: 是Nest提供的一种交互式命令行解析器; (可查看会议室管理模块-后端开发)
加密模块: import * as crypto from 'crypto';



pakcage.json:
ad
    "dev": "nest start --watch",
    "r": "nest g resource",
    "d": "nest g decorator",
    "g": "nest g guard",
    "ii": "nest g interceptor",
    "mm": "nest g module",
    "mi": "nest g middleware",
    "p": "nest g pipe",
    "cc": "nest g co",
    "ss": "nest g service",
   
nest-cli.json

  "generateOptions":{
      "spec" : false
  },
*/







/**Middleware 中间件 在路由处理程序前/后加入一些处理逻辑 (全局路由/指定路由/最外层调用) */
/**Guard 路由守卫(全局路由/指定路由)
 * 可以用于在调用某个 Controller 之前判断权限，返回 true 或者 false 来决定是否允许执行。
 */
/**Interceptor 拦截器(全局Conroller/单个Controller)
 * 在通过路由守卫之后，拦截器组织了一个链条，一个个的调用，最后会调用的 controller 的方法。
 */
/**Pipe 管道(某个参数/全局路由/指令路由)
 * 调用 controller 方法之前，会使用 pipe 对参数做处理：用来对参数做一些检验和转换。
 */
/**ExceptionFilter 异常处理(全局路由/单个路由)
 * 执行时机: 路由响应前做一些异常处理。
 * 不管是 Pipe、Guard、Interceptor 还是最终调用的 Controller，过程中都可以抛出一些异常。
 * 
 * 实现 ExceptionFilter 接口，
 * 要拦截什么异常还需要用 @Catch 装饰器来声明，
 * 然后实现 catch 方法，就可以拦截异常了，
 * 拦截了异常之后，可以返回对应的响应，给用户更友好的提示。
 */


/*中间件/守卫/拦截器/管道/异常处理
为什么要区分： 因为这样分工更明确，有自己的逻辑,可以灵活添加卸载，所以更容易维护或者扩展。这也是AOP架构的好处。
*/
/*Middleware和Interceptor的异同
 * 它们都是Nest AOP思想的实现,都是在触发路由handler前后执行某些逻辑的周期函数。
 * 1.middleware 比interceptor 更先触发,并且还没通过守卫验证,所以更适合处理和具体业务不相关的通用逻辑。
 * 2.interceptor 是能从 ExecutionContext 里拿到目标 class 和 handler，
 * 进而通过 reflector 拿到它的 metadata 等信息的，这些 middleware 就不可以。
*/




/* Nest通关秘籍
   建议回看: 
      13.Metadata 和 Reflector

   待看:
      116.RabbitMQ

   简略看了一下: 
      59.docker-compose(多个容器指定顺序部署，需要指定ip和端口，没下面那种方便)
      60.docker桥接网络 (多容器通信，指定同一个网络，不用指定ip，互相能通过容器名访问。)
      61.Docker容器支持自动重启，就没必要上pm2了（可以在 docker run 的时候通过 --restart 指定重启策略，或者 Docker Compose 配置文件里配置 restart。）
      64.Nginxh灰度系统
      66.基于Redis实现分布式session (中小型系统暂时不需要分布式session，1.可以采用Tomcat原生支持的Session复制方案| 2.使用Redis或Memcached等键值对存储来实现)
      74.定时任务 + Redis 实现阅读量计数
      79.Nest的REPL模式

      
   没看: 
      67.Redis + 高德地图，实现附近的充电宝
      77.基于sharp实现gif压缩工具


*/